﻿using BLLUtilidades;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BLLTarasca
{
    public class BLLMovimiento : BLLPadre<TarascaDataContext>
    {
        public BLLMovimiento(TarascaDataContext contexto) : base(contexto) { }
        public BLLMovimiento() : this(new TarascaDataContext()) { }

        public List<TA_Movimiento> TraerMovimientos(int idCuenta, int mes, int año)
        {
            return (from m in Contexto.TA_Movimientos
                    where m.TA_Categoria.IdCuenta == idCuenta
                    && m.Fecha.Value.Year == año
                    && m.Fecha.Value.Month == mes
                    orderby m.Fecha.Value descending, m.IdMovimiento descending
                    select m).ToList();
        }

        public List<TA_Movimiento> TraerMovimientos(int idCuenta, int mes, int año,out decimal? ingresos, out decimal? gastos, out decimal saldo)
        {
            saldo = 0;

            List<TA_Movimiento> movimientos = TraerMovimientos(idCuenta, mes, año);

            ingresos = movimientos.Where(m => m.EsIngreso.Value).Sum(m => m.Monto);
            gastos = movimientos.Where(m => !m.EsIngreso.Value).Sum(m => m.Monto);

            if (ingresos != null)
                saldo += ingresos.Value;
            if (gastos != null)
                saldo -= gastos.Value;

            return movimientos;
        }

        public void CalcularTotales(int idCuenta, out decimal totalIngresado, out decimal totalGastado, out decimal saldoTotal)
        {
            decimal? aux = 0;

            aux = (from m in Contexto.TA_Movimientos
                   where m.TA_Categoria.IdCuenta == idCuenta && m.EsIngreso.Value
                   select m.Monto).Sum();
            totalIngresado = (aux == null) ? 0 : aux.Value;

            aux = (from m in Contexto.TA_Movimientos
                   where m.TA_Categoria.IdCuenta == idCuenta && !m.EsIngreso.Value
                   select m.Monto).Sum();
            totalGastado = (aux == null) ? 0 : aux.Value;

            saldoTotal = totalIngresado - totalGastado;
        }

        public void CargarNuevoMovimiento(TA_Movimiento nuevoMovimiento)
        {
            Contexto.TA_Movimientos.InsertOnSubmit(nuevoMovimiento);
        }

        public TA_Movimiento TraerMovimiento(int idMovimiento)
        {
            return Contexto.TA_Movimientos.Where(m => m.IdMovimiento == idMovimiento).FirstOrDefault();
        }

        public void Eliminar(int idMovimiento)
        {
            TA_Movimiento movimiento = TraerMovimiento(idMovimiento);
            Contexto.TA_Movimientos.DeleteOnSubmit(movimiento);
        }

        public bool Pertenece(string nombreUsuario, int idMovimiento)
        {
            return Contexto.TA_Movimientos.Where(m => m.IdMovimiento == idMovimiento && m.TA_Categoria.TA_Cuenta.TA_Usuario.Nombre.ToLower().Equals(nombreUsuario.ToLower())).Count() > 0;
        }
    }
}
